WebGL - Как правильно передать параметр программы в gl.attachShader в Typescript?

Я создаю программу следующим образом:

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 любым шрифтом.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
546
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка выдается не компилятором TypeScript, а средой выполнения браузера. Если strictNullChecks включен в tsconfig.jsoncompilerOptions, вы увидите, что возвращаемый тип WebGLRenderingContext/createProgramWebGLProgram | 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!");
}

Площадка для TypeScript

Спасибо, но это, к сожалению, не решает мою проблему. Вы правы, это ошибка времени выполнения браузера, однако у меня strictNullChecks установлено значение false. Проблема, по-видимому, не связана с фактом, что программа может быть нулевой. Это связано с тем, что программа является типом объекта, а не WebGLProgram.

Edward 31.07.2019 16:40

@Edward В JavaScript typeof null === 'object' TypeScript компилируется в JavaScript.

Jex 01.08.2019 06:02

Спасибо, что указали на это, typeof null === 'object' это не то, о чем я знал.

Edward 02.08.2019 11:14

Другие вопросы по теме