Я создаю программу следующим образом:
const program: WebGLProgram = gl.createProgram();
Затем, в конце концов, попытайтесь присоединить шейдер к программе следующим образом:
gl.attachShader(program, vertexShader);
Это вызывает следующую ошибку:
Error: TypeError: Failed to execute 'attachShader' on 'WebGL2RenderingContext': parameter 1 is not of type 'WebGLProgram'.
При наблюдении за программой typeof program равно object, поэтому ошибка имеет смысл.
Если я попытаюсь сделать следующее, что сработает, если я изменю тип программы на любой, поскольку typeof program.program равно WebGLProgram:
gl.attachShader(program.program, vertexShader);
Он выдаст следующую ошибку:
Property 'program' does not exist on type 'WebGLProgram'.
Как правильно решить эту проблему в Typescript? Я бы предпочел не писать program.program любым шрифтом.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ошибка выдается не компилятором TypeScript, а средой выполнения браузера. Если strictNullChecks включен в tsconfig.jsoncompilerOptions, вы увидите, что возвращаемый тип WebGLRenderingContext/createProgram — WebGLProgram | null, тогда вы должны сначала проверить, что program не равно нулю:
const canvas = document.createElement("canvas");
const gl = canvas.getContext("webgl");
if (gl) {
const program = gl.createProgram();
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
if (program && vertexShader) {
gl.attachShader(program, vertexShader);
} else {
throw new Error("WebGL createProgram or createShader failed!");
}
} else {
throw new Error("WebGL seems not supported!");
}
@Edward В JavaScript typeof null === 'object' TypeScript компилируется в JavaScript.
Спасибо, что указали на это, typeof null === 'object' это не то, о чем я знал.
Спасибо, но это, к сожалению, не решает мою проблему. Вы правы, это ошибка времени выполнения браузера, однако у меня
strictNullChecksустановлено значение false. Проблема, по-видимому, не связана с фактом, что программа может быть нулевой. Это связано с тем, что программа является типом объекта, а не WebGLProgram.